package com.situ.mall.common.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageHelper;
import com.situ.mall.common.entity.Category;
import com.situ.mall.common.entity.Product;
import com.situ.mall.common.exception.MyException;
import com.situ.mall.common.mapper.CategoryMapper;
import com.situ.mall.common.mapper.ProductMapper;
import com.situ.mall.common.service.IProductService;
import com.situ.mall.common.vo.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author JavaWizard
 * @since 2023-09-12
 */
@Service
public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements IProductService {

    @Autowired
    private CategoryMapper categoryMapper;

/* 后台请求 */
    //查询商品表格
    @Override
    public TableVO table(Integer page, Integer limit, Integer categoryId, String name, String edition) {
        //PageHelper 分页小工具
        PageHelper.startPage(page,limit);
        //上边这行代码后跟的第一次查数据库是分页查询，只生效一次！！！
        List<ProductVO> list = baseMapper.list(categoryId,name,edition);
        return TableVO.data(list);
    }

    //保存 新增保存 or 编辑保存
    @Override
    public void saveProduct(Product product) {
        //判断是否商品名重复
//        Product p = baseMapper.selectByName(product.getName(),product.getId());
//        //如果根据商品名查到了，说明商品名重复，不能添加商品
//        if (p != null) {
//            throw new MyException("商品名已经被使用");
//        }
        //如果没传状态码，指定状态码为0，放到里面
        if (product.getStatus() == null || product.getStatus().isEmpty()){
            product.setStatus("0");
        }

        if (product.getId() == null){
            baseMapper.save(product);//新增保存
        }else {
            //如果是下架切换到上架，则把所属分类的状态也切换到上架
            if (product.getStatus().equals("0")){
                Category category = new Category();
                category.setId(product.getCategoryId());
                category.setStatus("0");
                categoryMapper.updateById(category);
            }
            baseMapper.update(product);//编辑保存
        }
    }

    //删除
    @Override
    public void delete(Integer id) {
        //上架中，删不了
        Product p = baseMapper.selectById(id);
        if (Objects.equals(p.getStatus(), "0")){
            throw new MyException("此商品正在上架中，无法删除");
        }
        baseMapper.delete(id);
    }

    //编辑——根据ID查询该行数据带到前台
    @Override
    public EditProductVO selectById(Integer id) {
        return baseMapper.edit(id);
    }

    //查询二级分类
    @Override
    public List<Category> all() {
        return baseMapper.all();
    }


/* 前端请求 */
    //查首页展示的商品
    @Override
    public List<IndexProductVO> indexProducts(Integer id) {

        List<IndexProductVO> result = new ArrayList<>();

        //传一个一级分类的id，查该分类下最新的八个子分类
        List<Category> list = categoryMapper.select8(id);

        //遍历这八个子分类，每遍历一次，就取这个子分类中最便宜的单品，放到result中
        for (Category c : list){
            //根据分类id，查这个子分类下最便宜的
            IndexProductVO p = baseMapper.selectCheapest(c.getId());
            //如果该子分类下有商品，就放到result中
            if (p != null){
                result.add(p);
            }
        }
        return result;
    }

    //根据商品名查，返回同名的所有商品
    @Override
    public List<ProductVO> getByName(String name) {
        return baseMapper.getByName(name);
    }

    //根据ids查商品
    @Override
    public List<CartVO> selectByIds(String ids, Integer memberId) {
        String[] split = ids.split(",");
        //根据拆出来的商品id 和 用户id，去商品表里查
        return baseMapper.selectByIds(split, memberId);
    }
}
